package com.asj.vivo.lock.service.recover;


import static com.asj.enums.DeviceIdentifierDictEnums.INVALID;
import static com.asj.enums.DeviceIdentifierDictEnums.LOCKUP_MACHINE;
import static com.asj.enums.DeviceIdentifierDictEnums.OFF_LINE;
import static com.asj.enums.DeviceIdentifierDictEnums.PENDING_SUPERVISE;
import static com.asj.enums.DeviceIdentifierDictEnums.TO_BE_UNLOCKED;
import static com.asj.enums.DeviceIdentifierDictEnums.json_key_deviceCode;
import static com.asj.enums.DeviceIdentifierDictEnums.json_key_lockStatus;
import static com.asj.enums.DeviceIdentifierDictEnums.json_key_message;
import static com.asj.enums.DeviceIdentifierDictEnums.json_key_result;
import static com.asj.enums.DeviceIdentifierDictEnums.json_key_superviseStatus;
import static com.asj.enums.HttpRequestDictEnums.queryDeviceExistUrl;
import static com.asj.enums.HttpRequestDictEnums.receiveCorrectDeviceInfo;
import static com.asj.enums.ResultCodeEnums.request_error;
import static com.asj.enums.ResultCodeEnums.request_success;
import static com.asj.enums.ResultCodeEnums.result_error;

import android.content.Context;
import android.util.Log;

import com.asj.MainActivity;
import com.asj.enums.DeviceIdentifierDictEnums;
import com.asj.service.oppoSdk.OPPOControlService;
import com.asj.service.recover.correct.CorrectDeviceAppInfo;
import com.asj.service.recover.correct.CorrectDeviceRestrictInfo;
import com.asj.service.recover.correct.CorrectDeviceStatusInfo;
import com.asj.utils.HttpRequestUtils;
import com.asj.utils.ResultUtils;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

/**
 * 矫正设备服务
 * */
public class RecoverDeviceInfoService {
    private static MainActivity mainActivity;

    /**
     * 矫正设备与后台app数据信息一致
     * */
    public static void correctDeviceAppInfo(Context context){
        /* 1.获取本机设备上的所有第三方应用 */
        /* 2.通过接口获取后台上该设备所拥有的第三方应用 */
        /* 3.筛选出后台有的，和后台多余的 */
        /* 4.将信息发送回去，让后台对数据进行处理 */
        CorrectDeviceAppInfo.listenAppInstallLose(context);
    }

    /**
     * 矫正设备与后台限制项一致
     * */
    public static void correctDeviceRestrictInfo(Context context) throws Exception {
        /* 1.获取后台上所有的限制项（涵盖设备功能限制，app限制，app可信任市场限制） */
        /* 2.根据不同的功能限制，调用不同的方法进行处理 */
        CorrectDeviceRestrictInfo.verifyRestrictItem(context);
    }

    /**
     * 矫正设备状态
     * */
    public static void correctDeviceStatusInfo(JsonObject deviceStatusInfo,MainActivity mainActivity,Context context){
        /* 1.获取后端传输过来的设备的状态信息 */
        JsonElement resultElement = deviceStatusInfo.get(json_key_result.getValue());
        if(resultElement == null || resultElement.isJsonNull()){
            //使用重复请求的进行执行，如果执行失败就算了
            String retryHttpRequest = HttpRequestUtils.retryHttpRequest(queryDeviceExistUrl.getValue(), deviceStatusInfo.toString(), request_success.getCode(), 5, context);
            if(retryHttpRequest.equals(request_error.getMessage())){
                return;
            }
            JsonObject deviceInfo = JsonParser.parseString(retryHttpRequest).getAsJsonObject();
            //确认结果是否为true
            if(ResultUtils.isOK(deviceInfo.get("code").getAsString())){
                if(!DeviceIdentifierDictEnums.DEVICE_UN_EXIST.getValue().equals(deviceInfo.get(json_key_message.getValue()).getAsString())){
                    resultElement= deviceInfo.get(json_key_result.getValue());
                }
            }
        }

        //创建业务控制对象
        OPPOControlService oppoControlService = new OPPOControlService(context);

        //针对各个状态处理,除了待锁定/解锁以外还有待解除监管的状态
        /* 2.非空判断 android里面的json为空很容易让你浪费一个小时解决问题 */
        if(resultElement != null && !resultElement.isJsonNull()){
            //转换为JsonObject对象
            JsonObject deviceLockStatus = resultElement.getAsJsonObject();

            //请求参数的JsonObject对象
            JsonObject requestParam = new JsonObject();

            /* 3.取出后端的设备状态，进行判断 */
            String lockStatus = null;
            if(deviceLockStatus.get(json_key_lockStatus.getValue()) != null){
                lockStatus = deviceLockStatus.get(json_key_lockStatus.getValue()).getAsString();
                //待锁定状态纠正
                if (LOCKUP_MACHINE.getValue().equals(lockStatus)) {
                    CorrectDeviceStatusInfo.correctLockedStatus(deviceLockStatus,requestParam,oppoControlService);
                }
                //待解锁状态纠正
                else if(TO_BE_UNLOCKED.getValue().equals(lockStatus)){
                    CorrectDeviceStatusInfo.correctUnlockedStatus(requestParam,oppoControlService);
                }
            }
            /* 4.取出后端的监管状态，进行判断 */
            String superviseStatus = null;
            if(deviceLockStatus.get(json_key_superviseStatus.getValue()) != null){
                superviseStatus = deviceLockStatus.get(json_key_superviseStatus.getValue()).getAsString();
                //待监管状态纠正
                if(PENDING_SUPERVISE.getValue().equals(superviseStatus)){
                    CorrectDeviceStatusInfo.correctPendingSupervise(requestParam,oppoControlService,context);
                }
                //离线状态纠正
                else if(OFF_LINE.getValue().equals(superviseStatus)){
                    CorrectDeviceStatusInfo.correctOffLine(requestParam);
                }
            }
            //如果返回的lockStatus不为空或者不等于INVALID，就发送请求
            if((lockStatus != null && !lockStatus.equals(INVALID.getValue())) || superviseStatus != null){
                requestParam.addProperty(json_key_deviceCode.getValue(),deviceLockStatus.get(json_key_deviceCode.getValue()).getAsString());
                new Thread(()->{
                    String result = HttpRequestUtils.retryHttpRequest(receiveCorrectDeviceInfo.getValue(), requestParam.getAsJsonObject().toString(),request_success.getCode(),5,context);
                    if(!result_error.getMessage().equals(result)){
                        Log.w("矫正设备状态","矫正成功！"+deviceLockStatus+"response::"+result);
                    }
                }).start();
            }else{
                Log.w("设备状态矫正","无需矫正！");
            }
        }
    }



}
